package study.java.jdk.jdk8._1_stream.intermediate;

import cn.hutool.core.convert.Convert;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import study.java.jdk.jdk8.User1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * （1）要求输入一个 Function 的函数是接口实例，功能是将 T类型 转换成 R类型
 * （2）接收一个函数作为参数，该函数会被应用到每个元素上，并将其映射成一个新的元素
 * （3）对于 Stream 中包含的元素使用给定的转换函数进行转换操作，新生成的 Stream 只包含转换生成的元素
 */
@Slf4j
public class _2_map_Test {

    /**
     * ==============================
     * （1）转换函数
     * ==============================
     *
     * @param mapper -Function（映射器/转换器）
     */
    @Test
    public void test() {
        List<String> src = Arrays.asList("apple", "banana", "orange");
        //
        src.stream().map(String::length);
        //
        src.stream().map(e -> e + "asdfaso");
        //
        src.stream().map(e -> {
            log.info(">>> {}= {}", e, e.length());
            return e.length();
        });
    }

    @Test
    public void test2() {
        User1 u1 = User1.builder().code("123").build();
        User1 u2 = User1.builder().code("abc").build();
        List<User1> userLt = Arrays.asList(u1, u2);

        List<String> codeLt = userLt.stream()
                .map(User1::getCode)
                .collect(Collectors.toList());
        log.info("{}", codeLt);
    }

    //
    @Test
    public void test3() {
        User1 u1 = User1.builder().code("123").name("wangzhj").build();
        User1 u2 = User1.builder().code("456").name("wzj").build();
        List<User1> userLt = Arrays.asList(u1, u2);

        List<String> codeLt = new ArrayList<>();
        List<String> nameLt = userLt.stream()
                .map(u -> {
                    codeLt.add(u.getCode());
                    return u.getName();
                })
                .collect(Collectors.toList());
        log.info("{}", nameLt);
        log.info("{}", codeLt);
    }

    //
    @Test
    public void test4() {

        List<String> dataLt = Arrays.asList("1", "", "3");

        List<Integer> myDataLt = dataLt.stream()
                .map(e -> Convert.toInt(e)).filter(Objects::nonNull)
                .collect(Collectors.toList());
        log.info("{}", myDataLt);
    }
}
